package com.mvp.lt.airlineview.base;

import android.app.Activity;
import android.graphics.Point;
import android.view.View;
import android.widget.TextView;

import com.amap.api.maps.AMap;
import com.amap.api.maps.AMapUtils;
import com.amap.api.maps.model.BitmapDescriptor;
import com.amap.api.maps.model.BitmapDescriptorFactory;
import com.amap.api.maps.model.LatLng;
import com.amap.api.maps.model.Marker;
import com.amap.api.maps.model.MarkerOptions;
import com.amap.api.maps.model.Polygon;
import com.amap.api.maps.model.PolygonOptions;
import com.amap.api.maps.model.Polyline;
import com.amap.api.maps.model.PolylineOptions;
import com.mvp.lt.airlineview.R;
import com.mvp.lt.airlineview.map.MapCalculationLogLatDistance;
import com.mvp.lt.airlineview.utils.UIUtils;

import java.util.List;

/**
 * $activityName
 * 地图面积。长度计算
 *
 * @author ${LiuTao}
 * @date 2018/6/13/013
 */

public class MapCalculationUtil {
    /**
     * @param {Object} latlng - {lat,lng}
     * @method 设置经纬度转换成页面像素坐标的方法
     */
    public static Point latlng2px(AMap aMap, LatLng latlng) {
        /**百度，map为 new BMap.Map() 对象*/
        return aMap.getProjection().toScreenLocation(latlng);


    }

    /**
     * @param {Array} px - [lng,lat]
     * @method 设置像素坐标转换成经纬度点的方法
     */
    public static LatLng px2latlng(AMap aMap, Point point) {
        /**百度，map为 new BMap.Map() 对象*/

        return aMap.getProjection().fromScreenLocation(point);


    }

    public static double workOutArea(List<LatLng> latLngList) {
        return work3DOutArea(latLngList);
    }

    /**
     * 计算面积
     * 平方米
     *
     * @param
     * @return
     */
    public static double work3DOutArea(List<LatLng> latLngList) {
        if (latLngList.size() < 3) {
            return 0;
        }
        int j = 0;
        double s = 0;

        for (int i = 0; i < latLngList.size(); i++) {
            j = i + 2;
            double a = MapCalculationLogLatDistance.getDistanceTwoMi(
                    latLngList.get(0).latitude,
                    latLngList.get(0).longitude,
                    latLngList.get(i + 1).latitude,
                    latLngList.get(i + 1).longitude);
            double b = MapCalculationLogLatDistance.getDistanceTwoMi(latLngList.get(i + 1)
                    .latitude, latLngList.get(i + 1)
                    .longitude, latLngList.get(i + 2)
                    .latitude, latLngList.get(i + 2)
                    .longitude);
            double c = MapCalculationLogLatDistance.getDistanceTwoMi(
                    latLngList.get(0).latitude,
                    latLngList.get(0).longitude, latLngList
                            .get(i + 2).latitude, latLngList
                            .get(i + 2).longitude);

            double p = (a + b + c) / 2;

            s += Math.sqrt(p * (p - a) * (p - b) * (p - c));
            if (j >= latLngList.size() - 1) {
                break;
            }
        }
        return s;
    }


    /**
     * 获取不规则多边形重心点
     *
     * @param mPoints
     * @return
     */
    public static LatLng getCenterOfGravityPoint(List<LatLng> mPoints) {
        double area = 0.0;//多边形面积

        double Gx = 0.0, Gy = 0.0;// 重心的x、y
        for (int i = 1; i <= mPoints.size(); i++) {
            double iLat = mPoints.get(i % mPoints.size()).latitude;
            double iLng = mPoints.get(i % mPoints.size()).longitude;
            double nextLat = mPoints.get(i - 1).latitude;
            double nextLng = mPoints.get(i - 1).longitude;
            double temp = (iLat * nextLng - iLng * nextLat) / 2.0;
            area += temp;
            Gx += temp * (iLat + nextLat) / 3.0;
            Gy += temp * (iLng + nextLng) / 3.0;
        }
        Gx = Gx / area;
        Gy = Gy / area;
        return new LatLng(Gx, Gy);
    }

    /**
     * 获取不规则多边形重心点
     *
     * @param mPoints
     * @return
     */
    public static LatLng getCenterOfGravity3DPoint(List<LatLng> mPoints) {
        double area = 0.0;//多边形面积

        double Gx = 0.0, Gy = 0.0;// 重心的x、y
        for (int i = 1; i <= mPoints.size(); i++) {
            double iLat = mPoints.get(i % mPoints.size()).latitude;
            double iLng = mPoints.get(i % mPoints.size()).longitude;
            double nextLat = mPoints.get(i - 1).latitude;
            double nextLng = mPoints.get(i - 1).longitude;
            double temp = (iLat * nextLng - iLng * nextLat) / 2.0;
            area += temp;
            Gx += temp * (iLat + nextLat) / 3.0;
            Gy += temp * (iLng + nextLng) / 3.0;
        }
        Gx = Gx / area;
        Gy = Gy / area;
        return new LatLng(Gx, Gy);
    }

    /**
     * 计算周长
     * 米
     *
     * @param latLngLists
     * @return
     */
    public static double getLength(List<LatLng> latLngLists) {
        float length = 0;

        for (int i = 0; i < latLngLists.size(); i++) {
            LatLng latLng1;
            LatLng latLng2;
            if (i == latLngLists.size() - 1) {
                latLng1 = latLngLists.get(i);
                latLng2 = latLngLists.get(0);
            } else {
                latLng1 = latLngLists.get(i);
                latLng2 = latLngLists.get(i + 1);
            }
            float distance = (float) (Math.round(AMapUtils.calculateLineDistance(latLng1, latLng2) * 10)) / 10;
            length += distance;
        }
        return formatDouble1(length);
    }

    /**
     * 计算周长
     * 米
     *
     * @param latLngLists
     * @return
     */
    public static double get3DLength(List<LatLng> latLngLists) {
        float length = 0;

        for (int i = 0; i < latLngLists.size(); i++) {
            LatLng latLng1;
            LatLng latLng2;
            if (i == latLngLists.size() - 1) {
                latLng1 = new LatLng(latLngLists.get(i).latitude, latLngLists.get(i).longitude);
                latLng2 = new LatLng(latLngLists.get(0).latitude, latLngLists.get(0).longitude);
            } else {
                latLng1 = new LatLng(latLngLists.get(i).latitude, latLngLists.get(i).longitude);
                latLng2 = new LatLng(latLngLists.get(i + 1).latitude, latLngLists.get(i + 1).longitude);
            }
            float distance = (float) (Math.round(AMapUtils.calculateLineDistance(latLng1, latLng2) * 10)) / 10;
            length += distance;
        }
        return formatDouble1(length);
    }


    //计算
    public void calculation(List<LatLng> latLngs) {
        // 计算面积
        double s = work3DOutArea(latLngs);
        // 计算边长
        double slideLength = workSideLength(latLngs);
        // 计算周长，即 边长+第一点和最后一点的距离
        double girthLength = workGirthLength(latLngs, slideLength);
    }


    /**
     * 计算边长
     * 米
     *
     * @return
     */
    public double workSideLength(List<LatLng> latLngs) {
        if (latLngs.size() < 2) {
            return 0;
        }
        double sum = 0;
        int j = 0;
        for (int i = 0; i < latLngs.size(); i++) {
            double a = MapCalculationLogLatDistance.getDistanceTwoMi(latLngs.get(i).longitude, latLngs.get(i).latitude, latLngs.get(i + 1).longitude, latLngs.get(i + 1).latitude);
            sum += a;
            j = i + 1;
            if (j >= latLngs.size() - 1) {
                break;
            }
        }
        return sum;
    }

    /**
     * 计算周长
     * 米
     *
     * @param length 边长
     * @return
     */
    public double workGirthLength(List<LatLng> latLngs, double length) {
        double roundLength = 0;
        if (latLngs.size() < 3) {
            return length;
        }
        double a = MapCalculationLogLatDistance.getDistanceTwoMi(latLngs.get(0).longitude, latLngs.get(0).latitude,
                latLngs.get(latLngs.size() - 1).longitude, latLngs.get(latLngs.size() - 1).latitude) / 1000;
        roundLength = length + a;
        return roundLength;
    }

    /**
     * 保留2位小数
     *
     * @param d
     * @return
     */
    public static double format2Double(float d) {
        return (d * 100.0) / 100.0;
    }

    /**
     * 保留x位小数
     *
     * @param d
     * @return
     */
    public static double formatCustDouble(double d, int x) {
        int pfen = (int) Math.pow(10, x);
        return (double) Math.round(d * pfen) / (pfen);

    }

    /**
     * 保留一位小数，四舍五入的一个老土的方法
     *
     * @param d
     * @return
     */
    public static double formatDouble1(double d) {
        return (double) Math.round(d * 10) / 10;
    }


    // return (double) Math.round(d * 10) / 10;
    public static int updateFLYProgressData(List<LatLng> latLngList, int minID) {
        if (minID < 0) {
            minID = 0;
        }
        if (latLngList != null && latLngList.size() > 1) {
            //计算百分比
            return (int) ((minID * 1.0 / (latLngList.size() - 1)) * 100);
        } else {
            return 0;
        }

    }

    public static Polyline drawPolyLineOptions(AMap aMap, List<LatLng> linelatLngs,
                                               int color, int color2) {
        PolylineOptions polylineOptions = new PolylineOptions();
        polylineOptions.addAll(linelatLngs);
        polylineOptions.width(5) // 多边形的边框
                .color(color); // 边框颜色
        return aMap.addPolyline(polylineOptions);
    }

    public static Polygon drawPolygonOptions(AMap aMap, List<LatLng> linelatLngs,
                                             int color, int color2) {
        PolygonOptions polygonOptions = new PolygonOptions();
        polygonOptions.addAll(linelatLngs);
        polygonOptions.strokeWidth(5) // 多边形的边框
                .strokeColor(color) // 边框颜色
                .fillColor(color2);   // 多边形的填充色
        return aMap.addPolygon(polygonOptions);
    }

    public static View getCrossPointView(Activity activity, String pm_val) {
        View view = activity.getLayoutInflater().inflate(R.layout.way_cross_point_marker, null);
        TextView mMarkerIndexNumber = (TextView) view.findViewById(R.id.instrest_marker_index_number);

        if ("起".equals(pm_val) || "终".equals(pm_val)) {
            mMarkerIndexNumber.setTextColor(UIUtils.getColor(R.color.colorAccent));
        } else {
            mMarkerIndexNumber.setTextColor(UIUtils.getColor(R.color.black));
        }
        mMarkerIndexNumber.setText(pm_val);
        return view;
    }

    public static Marker setStartAndEndMarkerView(AMap aMap, Marker marker, LatLng LatLng, final int i, View view) {
        if (marker != null) {
            marker.destroy();
        }
        BitmapDescriptor markerIcon = BitmapDescriptorFactory.fromView(view);
        final MarkerOptions markerOptions = new MarkerOptions().position(LatLng).icon(markerIcon);

        marker = aMap.addMarker(markerOptions);
        marker.setAnchor(0.5f, 0.9f);
        marker.setSnippet(String.valueOf(i));
        return marker;
    }


}
